home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Utilities / Text and Speech / BBEdit 2.2.2 / BBEdit Extensions / Sources / CopyContaining.c < prev    next >
C/C++ Source or Header  |  1992-09-09  |  2KB  |  138 lines

  1. #include <SetupA4.h>
  2. #include "ExternalInterface.h"
  3. #include "DialogUtilities.h"
  4.  
  5. static void maintain_buttons(DialogPtr d)
  6. {
  7.     Boolean enable;
  8.     Str255 s;
  9.     
  10.     ReadStrItem(d, 4, s);
  11.     enable = (s[0] != 0);
  12.     
  13.     if (enable != TestDlgCtl(d, 1))
  14.         XAbleDlgCtl(d, 1, enable);
  15. }
  16.  
  17. pascal Boolean (*std_filter)(DialogPtr d, EventRecord *event, short *item);
  18.  
  19. static pascal Boolean filter(DialogPtr d, EventRecord *event, short *item)
  20. {    
  21.     Boolean result;
  22.     
  23.     SetUpA4();
  24.     
  25.     maintain_buttons(d);
  26.     
  27.     result = std_filter(d, event, item);
  28.     
  29.     RestoreA4();
  30.     
  31.     return result;
  32. }
  33.  
  34. pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
  35. {
  36.     long line_count;
  37.     long line;
  38.     
  39.     long line_start;
  40.     long line_end;
  41.     
  42.     Handle text;
  43.     
  44.     Handle    copy;
  45.     Boolean    found;
  46.     
  47.     Str255 search_str;
  48.     Boolean case_sensitive;
  49.  
  50.     DialogPtr d;
  51.     GrafPtr save_port;
  52.     
  53.     short item;
  54.         
  55.     long offset;
  56.     
  57.     OSErr err;
  58.     
  59.     RememberA0();
  60.     SetUpA4();
  61.     
  62.     case_sensitive = FALSE;
  63.     
  64.     GetPort(&save_port);
  65.     
  66.     d = callbacks->CenterDialog(128);
  67.     SetPort(d);
  68.     
  69.     std_filter = callbacks->StandardFilter;
  70.     
  71.     do {
  72.         ModalDialog(filter, &item);
  73.         if (item == 3)
  74.         {
  75.             case_sensitive = ! case_sensitive;
  76.             SetDlgCtl(d, item, case_sensitive);
  77.         }
  78.     } while ((item != 1) && (item != 2));
  79.     
  80.     ReadStrItem(d, 4, search_str);
  81.         
  82.     DisposDialog(d);
  83.     SetPort(save_port);
  84.     
  85.     if (item == 1)
  86.     {
  87.         line_count = callbacks->GetLastLine();
  88.         text = callbacks->GetWindowContents(w);
  89.         
  90.         found = FALSE;
  91.         copy = NewHandle(0);
  92.     
  93.         err = noErr;
  94.         
  95.         for (line = 0; line < line_count; line++)
  96.         {
  97.             line_start = callbacks->GetLinePos(line);
  98.             line_end = callbacks->GetLineEnd(line_start);
  99.             
  100.             offset = callbacks->FindPattern(*text, line_end, line_start,
  101.                                             (char *)&search_str[1], search_str[0],
  102.                                             case_sensitive);
  103.                                             
  104.             if (offset >= 0)
  105.             {
  106.                 MoveHHi(text);
  107.                 HLock(text);
  108.                 
  109.                 err = PtrAndHand(*text + line_start, copy, line_end - line_start + 1);
  110.                 HUnlock(text);
  111.                 
  112.                 if (err)
  113.                     break;
  114.                 
  115.                 found = TRUE;
  116.             }
  117.         }
  118.         
  119.         if (err)
  120.             callbacks->ReportOSError(err);
  121.         else 
  122.         {
  123.             if (found)
  124.             {
  125.                 HLock(copy);
  126.                 ZeroScrap();
  127.                 PutScrap(GetHandleSize(copy), 'TEXT', *copy);
  128.             }
  129.             else
  130.                 SysBeep(2);
  131.         }
  132.         
  133.         DisposHandle(copy);
  134.     }
  135.     
  136.     RestoreA4();
  137. }
  138.